/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __XOS_STL_AUTO_AUTH_H__
#define __XOS_STL_AUTO_AUTH_H__

#include "auth.h"

namespace xos_auth
{

	template< class USER_TYPE = int, class OBJ = int >
	class auth
	{
	public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 构造函数
		auth( int u_uid, int u_a, int u_r, int u_m, int u_d, int o_uid, int o_a, int o_r, int o_m, int o_d )
		{
            set_user_auth_uarmd( u_uid, u_a, u_r, u_m, u_d );
            set_obj_auth_uarmd( o_uid, o_a, o_r, o_m, o_d );
		}
        auth( int u_uid, const USER_TYPE * pUserType, const OBJ * pObj, int o_uid, int o_a )
        {
            set_user_auth_armd( pUserType );
            set_user_id( u_uid );
            set_obj_auth_rmd( pObj );
            obj_uid = o_uid;
            obj_a = o_a;
        }
        auth( int u_uid, const USER_TYPE * pUserType, const OBJ * pObj, int o_uid )
        {
            set_user_auth_armd( pUserType );
            set_user_id( u_uid );
            set_obj_auth_armd( pObj );
            obj_uid = o_uid;
        }
        auth()
        {
            user_uid = 0;
            user_a = 0;
            user_r = 0;
            user_m = 0;
            user_d = 0;
            obj_uid = 0;
            obj_a = 0;
            obj_r = 0;
            obj_m = 0;
            obj_d = 0;
        }
		~auth(){}
	public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 设置用户权限
        void set_user_auth_uarmd( int uid, int a, int r, int m, int d )
        {
            user_uid = uid;
            user_a = a;
            user_r = r;
            user_m = m;
            user_d = d;
        }
        void set_user_auth_uarmd( const USER_TYPE * pUserType, int uid )
        {
            set_user_auth_armd( pUserType );
            user_uid = uid;
        }
        void set_user_auth_armd( const USER_TYPE * pUserType )
        {
            user_a = pUserType->add_auth;
            user_r = pUserType->read_auth;
            user_m = pUserType->modify_auth;
            user_d = pUserType->del_auth;
        }
        void set_user_id( int uid )
        {
            user_uid = uid;
        }
        void reset_user()
        {
            user_uid = 0;
            user_a = 0;
            user_r = 0;
            user_m = 0;
            user_d = 0;
        }
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 设置对象权限
        void set_obj_auth_uarmd( int uid, int a, int r, int m, int d )
        {
            set_obj_auth_armd( a, r, m, d );
            obj_uid = uid;
        }
        void set_obj_auth_armd( int a, int r, int m, int d )
        {
            set_obj_auth_rmd( r, m, d );
            obj_a = a;
        }
        void set_obj_auth_rmd( int r, int m, int d )
        {
            obj_r = r;
            obj_m = m;
            obj_d = d;
        }
        void set_obj_uid( int uid )
        {
            obj_uid = uid;
        }
        void reset_obj()
        {
            obj_uid = 0;
            obj_a = 0;
            obj_r = 0;
            obj_m = 0;
            obj_d = 0;
        }
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 设置对象权限
        void set_obj_auth_uarmd( const OBJ * pObj, int uid, int a )
        {
            set_obj_auth_rmd( pObj );
            obj_uid = uid;
            obj_a = a;
        }
        void set_obj_auth_uarmd( const OBJ * pObj, int uid )
        {
            set_obj_auth_armd( pObj );
            obj_uid = uid;
        }
        void set_obj_auth_urmd( const OBJ * pObj, int uid )
        {
            set_obj_auth_rmd( pObj );
            obj_uid = uid;
        }
        void set_obj_auth_armd( const OBJ * pObj, int a )
        {
            set_obj_auth_rmd( pObj );
            obj_a = a;
        }
        void set_obj_auth_armd( const OBJ * pObj )
        {
            set_obj_auth_rmd( pObj );
            obj_a = pObj->add_auth;
        }
        void set_obj_auth_rmd( const OBJ * pObj )
        {
            obj_r = pObj->read_auth;
            obj_m = pObj->modify_auth;
            obj_d = pObj->del_auth;
        }
	protected:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 权限变量
		int user_uid;
        int user_a;
		int user_r;
		int user_m;
		int user_d;
		int obj_uid;
        int obj_a;
		int obj_r;
		int obj_m;
		int obj_d;
	public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 当前用户下，指定权限是否可以修改对象权限
        bool can_modify_add( int want )
        {
            bool bRet = true;
            bRet = xos_auth::can_modify_add( want, user_a, obj_a );
            return bRet;
        }
        bool can_modify_read( int want )
        {
            bool bRet = true;
            bRet = xos_auth::can_modify_read( want, user_r, obj_r );
            return bRet;
        }
		bool can_modify_modify( int want )
		{
			bool bRet = true;
			bRet = xos_auth::can_modify_modify( want, user_m, obj_m );
			return bRet;
		}
        bool can_modify_delete( int want )
        {
            bool bRet = true;
            bRet = xos_auth::can_modify_delete( want, user_d, obj_d );
            return bRet;
        }
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 当前用户最高权限是否有修改对象权限
        bool can_modify_add()
        {
            bool bRet = true;
            bRet = can_modify_add( user_a - 1 );
            return bRet;
        }
        bool can_modify_read()
        {
            bool bRet = true;
            bRet = can_modify_read( user_r - 1 );
            return bRet;
        }
        bool can_modify_modify()
        {
            bool bRet = true;
            bRet = can_modify_modify( user_m - 1 );
            return bRet;
        }
		bool can_modify_delete()
		{
			bool bRet = true;
			bRet = can_modify_delete( user_d - 1 );
			return bRet;
		}
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 修改对象内容
        bool can_add()
        {
            bool bRet = true;
            bRet = xos_auth::can_add( user_uid, user_a, obj_uid, obj_a );
            return bRet;
        }
        bool can_read()
        {
            bool bRet = true;
            bRet = xos_auth::can_read( user_uid, user_r, obj_uid, obj_r );
            return bRet;
        }
        bool can_modify()
        {
            bool bRet = true;
            bRet = xos_auth::can_modify( user_uid, user_m, obj_uid, obj_m );
            return bRet;
        }
        bool can_delete()
        {
            bool bRet = true;
            bRet = xos_auth::can_delete( user_uid, user_d, obj_uid, obj_d );
            return bRet;
        }
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 是否有修改对象权限的全部权限
        bool has_full_auth_auth()
        {
            bool bRet = true;
            if( bRet )
            {
                bRet = can_modify_delete();
            }
            if( bRet )
            {
                bRet = can_modify_modify();
            }
            if( bRet )
            {
                bRet = can_modify_read();
            }
            if( bRet )
            {
                bRet = can_modify_add();
            }
            return bRet;
        }
        // 是否有部分修改权限的权限
        bool has_auth_auth()
        {
            bool bRet = false;
            if( !bRet )
            {
                bRet = can_modify_delete();
            }
            if( !bRet )
            {
                bRet = can_modify_modify();
            }
            if( !bRet )
            {
                bRet = can_modify_read();
            }
            if( !bRet )
            {
                bRet = can_modify_add();
            }
            return bRet;
        }
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 是否有修改对象内容的全部权限
        bool has_full_value_auth()
        {
            bool bRet = true;
            if( bRet )
            {
                bRet = can_modify();
            }
            if( bRet )
            {
                bRet = can_delete();
            }
            if( bRet )
            {
                bRet = can_read();
            }
            if( bRet )
            {
                bRet = can_add();
            }
            return bRet;
        }
        // 是否有修改对象内容的部分权限
        bool has_value_auth()
        {
            bool bRet = false;
            if( !bRet )
            {
                bRet = can_modify();
            }
            if( !bRet )
            {
                bRet = can_delete();
            }
            if( !bRet )
            {
                bRet = can_read();
            }
            if( !bRet )
            {
                bRet = can_add();
            }
            return bRet;
        }
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 是否有修改对象内容和权限的全部权限
        bool has_full_auth()
        {
            bool bRet = true;
            if( bRet )
            {
                bRet = has_full_value_auth();
            }
            if( bRet )
            {
                bRet = has_full_auth_auth();
            }
            return bRet;
        }
        // 是否有修改对象内容和权限的部分权限
		bool has_auth()
		{
			bool bRet = false;
            if( !bRet )
            {
                bRet = has_value_auth();
            }
			if( !bRet )
			{
				bRet = has_auth_auth();
			}
			return bRet;
		}
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
	};
}

#endif // __XOS_STL_AUTO_AUTH_H__
